package udp

import (
	"go.uber.org/zap"
	"gse/server"
	udpBackendServer "gse/transport/udp/listener"
	"net"
	"time"
)

type UDPServer struct {
	*server.ServerBase
}

type UDPServerConfig struct {
	BindAddress string
	Logger      *zap.Logger
	*udpBackendServer.UDPListnerConfig
	SesConfig *server.SessionConfig
}

func NewDefaultUDPServerConfig() UDPServerConfig {
	cfg := UDPServerConfig{
		BindAddress:      "127.0.0.1:3132",
		UDPListnerConfig: udpBackendServer.NewDefaultUDPListnerConfig(),
		SesConfig: &server.SessionConfig{
			ReqProcessTimeout: time.Millisecond * server.DefaultReqProcessTimeout,
			ReqWaitTimeout:    time.Millisecond * server.DefaultSessionReqWaitTimeout,
		},
	}
	return cfg
}

func NewUDPServer(cfg UDPServerConfig) *UDPServer {
	bindAddr, err := net.ResolveUDPAddr("udp4", cfg.BindAddress)
	if err != nil {
		panic(err)
	}
	conn, err := net.ListenUDP("udp4", bindAddr)
	if err != nil {
		panic(err)
	}
	if cfg.UDPListnerConfig == nil {
		cfg.UDPListnerConfig = udpBackendServer.NewDefaultUDPListnerConfig()
	}

	s := &UDPServer{
		server.NewServerBase(udpBackendServer.NewUDPListner(conn, cfg.UDPListnerConfig), cfg.SesConfig),
	}

	s.ServerBase.Init()
	return s
}
